package org.luckyjourney.schedul;

import org.luckyjourney.entity.video.Video;
import org.luckyjourney.entity.vo.HotVideo;

import java.util.*;

/**
*top k 算法
*/
public class TopK {

    private int k = 0;

    private Queue<HotVideo> queue;

    /**
     *
     * @param k  top k  最热门的的
     * @param queue
     */
    public TopK(int k,Queue<HotVideo> queue){
        this.k = k;
        this.queue = queue;
    }

    /**
     * 这个方法用于向队列中添加一个新的HotVideo对象。
     * 如果队列的大小小于k，则直接将新的HotVideo对象添加到队列中。
     * 如果队列已满（即大小为k），则比较队列头部的HotVideo对象（即当前最不热门的视频）与新的HotVideo对象的热度。如果新的视频更热门，则从队列中移除最不热门的视频，并将新的视频添加到队列中。
     * 需要注意的是，队列是一个FIFO（先进先出）的数据结构，但由于我们在每次添加新视频时都可能会移除队首的元素，所以实际上这个队列是作为一个优先级队列来使用的，其中元素的优先级由它们的热度决定。
     * @param hotVideo
     */
    public void add(HotVideo hotVideo) {
        if (queue.size() < k) {
            queue.add(hotVideo);
        } else if (queue.peek().getHot() < hotVideo.getHot()){
            queue.poll();
            queue.add(hotVideo);
        }
    }

    /**
     * 返回视频列表，按照热度从高到低排序。
     * @return
     */
    public List<HotVideo> get(){
        final ArrayList<HotVideo> list = new ArrayList<>(queue.size());

        while (!queue.isEmpty()) {
            list.add(queue.poll());
        }
        // 按照热度从高到低排序

        Collections.reverse(list);
        return list;
    }


}
